package com.xhs.service;

import com.xhs.model.User;
import com.xhs.manager.UserManager;
import com.xhs.dto.BrowserSession;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.concurrent.ConcurrentHashMap;
import java.util.Map;

/**
 * 会话管理服务
 *
 * @author xhs
 */
@Slf4j
@Service
public class SessionService {

    @Autowired
    private UserManager userManager;

    // 内存中缓存当前活跃的会话，用于浏览器操作
    private final Map<String, BrowserSession> activeSessions = new ConcurrentHashMap<>();

    /**
     * 保存会话
     */
    public void saveSession(BrowserSession session) {
        // 保存到内存缓存中，用于浏览器操作
        activeSessions.put(session.getSessionId(), session);
        
        // 保存到数据库中
        User user = userManager.findByPhoneNumber(session.getPhoneNumber());
        if (user == null) {
            // 创建新用户
            user = new User();
            user.setPhoneNumber(session.getPhoneNumber());
            user.setLoginStatus(0); // 初始状态为未登录
            userManager.save(user);
        }
        
        log.info("会话已保存到MySQL: sessionId={}, phoneNumber={}", session.getSessionId(), session.getPhoneNumber());
    }

    /**
     * 获取会话
     */
    public BrowserSession getSession(String sessionId) {
        // 优先从内存缓存中获取
        BrowserSession session = activeSessions.get(sessionId);
        if (session != null) {
            log.info("从内存缓存获取会话成功: sessionId={}", sessionId);
            return session;
        }
        
        log.warn("会话不存在或已过期: sessionId={}", sessionId);
        return null;
    }

    /**
     * 根据手机号获取会话
     */
    public BrowserSession getSessionByPhoneNumber(String phoneNumber) {
        // 从内存缓存中根据手机号查找会话
        for (BrowserSession session : activeSessions.values()) {
            if (phoneNumber.equals(session.getPhoneNumber())) {
                log.info("根据手机号获取会话成功: phoneNumber={}, sessionId={}", phoneNumber, session.getSessionId());
                return session;
            }
        }
        
        log.warn("未找到手机号对应的会话: phoneNumber={}", phoneNumber);
        return null;
    }

    /**
     * 根据手机号获取会话ID
     */
    public String getSessionIdByPhoneNumber(String phoneNumber) {
        // 从内存缓存中根据手机号查找会话ID
        for (BrowserSession session : activeSessions.values()) {
            if (phoneNumber.equals(session.getPhoneNumber())) {
                log.info("根据手机号获取会话ID成功: phoneNumber={}, sessionId={}", phoneNumber, session.getSessionId());
                return session.getSessionId();
            }
        }
        
        log.warn("未找到手机号对应的会话ID: phoneNumber={}", phoneNumber);
        return "unknown";
    }

    /**
     * 删除会话
     */
    public void deleteSession(String sessionId) {
        // 从内存缓存中删除
        BrowserSession session = activeSessions.remove(sessionId);
        
        if (session != null) {
            log.info("会话已删除: sessionId={}, phoneNumber={}", sessionId, session.getPhoneNumber());
        } else {
            log.warn("会话不存在，无法删除: sessionId={}", sessionId);
        }
    }

    /**
     * 更新会话
     */
    public void updateSession(BrowserSession session) {
        // 更新内存缓存中的会话
        activeSessions.put(session.getSessionId(), session);
        log.info("会话已更新: sessionId={}", session.getSessionId());
    }

    /**
     * 检查会话是否存在
     */
    public boolean existsSession(String sessionId) {
        boolean exists = activeSessions.containsKey(sessionId);
        log.debug("检查会话是否存在: sessionId={}, exists={}", sessionId, exists);
        return exists;
    }

    /**
     * 获取活跃会话数量
     */
    public int getActiveSessionCount() {
        int count = activeSessions.size();
        log.debug("获取活跃会话数量: count={}", count);
        return count;
    }

    /**
     * 更新会话状态
     */
    public void updateSessionStatus(String sessionId, BrowserSession.SessionStatus status) {
        BrowserSession session = activeSessions.get(sessionId);
        if (session != null) {
            session.setStatus(status);
            session.updateLastActiveTime();
            log.info("会话状态已更新: sessionId={}, status={}", sessionId, status);
        } else {
            log.warn("会话不存在，无法更新状态: sessionId={}", sessionId);
        }
    }
} 